GtkGLArea: Always destroy context on unrealize
authorAlexander Larsson <alexl@redhat.com>
Thu, 30 Oct 2014 11:08:31 +0000 (12:08 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 30 Oct 2014 11:43:03 +0000 (12:43 +0100)
We had some code that tried to reuse the context over realize, but
that doesn't work as we need to share with the possibly new
paint context of the re-realized window.

gtk/gtkglarea.c

index b9204f0c7a3faece29f4cbfb0b72548f96662b0d..5d4cac32031541d4f25ce2a8b78a070013ef9895 100644 (file)
@@ -247,7 +247,10 @@ gtk_gl_area_unrealize (GtkWidget *widget)
       else
        g_warning ("can't free framebuffer");
 
-      gdk_gl_context_clear_current ();
+      /* Make sure to destroy if current */
+      g_object_run_dispose (G_OBJECT (priv->context));
+      g_object_unref (priv->context);
+      priv->context = NULL;
     }
 
   g_clear_error (&priv->error);
@@ -379,24 +382,12 @@ gtk_gl_area_draw (GtkWidget *widget,
   return TRUE;
 }
 
-static void
-gtk_gl_area_screen_changed (GtkWidget *widget,
-                            GdkScreen *old_screen)
-{
-  GtkGLArea *self = GTK_GL_AREA (widget);
-  GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (self);
-
-  /* this will cause the context to be recreated on realize */
-  g_clear_object (&priv->context);
-}
-
 static void
 gtk_gl_area_class_init (GtkGLAreaClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  widget_class->screen_changed = gtk_gl_area_screen_changed;
   widget_class->realize = gtk_gl_area_realize;
   widget_class->unrealize = gtk_gl_area_unrealize;
   widget_class->size_allocate = gtk_gl_area_size_allocate;